<?php

/*!
 * \file GestionController.php
 * \namespace Site\AdminBundle\Controller
 * \class GestionController
 */

namespace Site\AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Site\UtilisateurBundle\Entity\Etudiant;
use Site\UtilisateurBundle\Entity\Utilisateur;
use Site\GeneralBundle\Entity\Ue;
use Site\AdminBundle\Csv\Csv;

class GestionController extends Controller
{
    public function indexAction()
    {
    }



/*!
 * \author Brice VICO
 *
 * \fn public function modifierEtudiantAction()
 * \return modifierEtudiant.html.twig
 *
 * \brief Cette fonction permet de modifier un étudiant déja existant en renseignant dans le formulaire de la vue le numéro étudiant.
 * \brief Ensuite nous avons le choix de modifier une notes ou une photo.
 * \brief La vue est retournée avec des variable spécifique :
 * \brief - afficherFlash : détermine si on doit afficher un message ou non.
 * \brief - typeFlash : nécessaire que si afficherFlash = 1, permet de faire varier de style de la boite de dialogue flash.
 * \brief - flash : contient le message flash à afficher si afficherFlash = 1.
 * \brief - form : le formulaire créé grâce à createFormBuilder et afficher ensuite avec $form->createView().
 *
 * \brief si une erreur survient alors elle est indiquée à l'utilisateur grâce aux message flash.
 */

    public function modifierEtudiantAction()
    {
        $etudiant = new Etudiant();
        $em = $this->getDoctrine()->getManager();
        $request = $this->get('request');

        $form = $this->createFormBuilder($etudiant)
            ->add('note', 'text', array('required' => false))
            ->add('numEtud', 'text')
            ->add('photo', 'file', array('required' => false))
        ->getForm();

        if ($request->getMethod() == 'POST')
        {
            $form->bind($request);

            if ($form->isValid())
            {

                $etudiantR = $em->getRepository("SiteUtilisateurBundle:Etudiant")->findOneByNumEtud($form['numEtud']->getData());

                if (!$etudiantR)
                {
                    $flash = "Aucun étudiant ne correspond a ce numéro.";

                    return $this->render('SiteAdminBundle:Gestion:modifierEtudiant.html.twig', array('form' => $form->createView(), 'typeFlash' => "danger", 'afficherFlash' => 1, 'afficherNumEtud' => 1, 'flash' => $flash));
                }

                if ($form['photo']->getData())
                {
                    $form['photo']->getData()->move("fichiers/photos/", $form['photo']->getData()->getClientOriginalName());
                    $etudiantR->setPhoto("fichiers/photos/". $form['photo']->getData()->getClientOriginalName());
                }

                $etudiantR->setNote($etudiant->getNote());

                    $em->persist($etudiantR);
                    $em->flush();

                    $flash = "Modification réussie.";

                    return $this->render('SiteAdminBundle:Gestion:modifierEtudiant.html.twig', array('form' => $form->createView(), 'typeFlash' => 'success', 'afficherFlash' => 1, 'flash' => $flash));
            }

                return $this->render('SiteAdminBundle:Gestion:modifierEtudiant.html.twig', array('form' => $form->createView(),'afficherFlash' => 0));
        }

        return $this->render('SiteAdminBundle:Gestion:modifierEtudiant.html.twig', array('form' => $form->createView(),'afficherFlash' => 0));
    }

/*!
 * \author Brice VICO
 *
 * \fn public function supprimerUtilisateurAction($id)
 * \return supprimerUtilisateur.html.twig
 *
 * \brief Cette fonction permet d'afficher une liste d'utilisateur en la récupérant depuis la BDD.
 * \brief La vue est retournée avec des variable spécifique :
 * \brief - afficherFlash : détermine si on doit afficher un message ou non.
 * \brief - typeFlash : nécessaire que si afficherFlash = 1, permet de faire varier de style de la boite de dialogue flash.
 * \brief - flash : contient le message flash à afficher si afficherFlash = 1.
 * \brief - form : le formulaire créé grâce à createFormBuilder et afficher ensuite avec $form->createView().
 *
 * \brief Si une erreur survient alors elle est indiquée à l'utilisateur grâce aux message flash.
 *
 * \brief Dans le cas ou $id n'est pas vide alors on retourn la fonction supprimerUtilisateurId($i, $donnees) ou données correspond a la liste d'utilisateur.
 */

    public function supprimerUtilisateurAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $donnees = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findAll();

        if ($id != '')
            return $this->supprimerUtilisateurId($id);
        else
        {
            $donneesTuteur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('t');
            $donneesSecretaire = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('s');
            $donneesEtudiant = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('e');
            $donneesUtilisateur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('u');

            if (count($donnees) == 0)
            {
                $typeFlash = "info";
                return $this->render('SiteAdminBundle:Gestion:supprimerUtilisateur.html.twig', array('afficherFlash' => 1, 'flash' => $flash, 'typeFlash' => $typeFlash, 'donneesTuteur' => $donneesTuteur, 'donneesSecretaire' => $donneesSecretaire, 'donneesEtudiant' => $donneesEtudiant, 'donneesUtilisateur' => $donneesUtilisateur));
            }

                return $this->render('SiteAdminBundle:Gestion:supprimerUtilisateur.html.twig', array('afficherFlash' => 0, 'donneesTuteur' => $donneesTuteur, 'donneesEtudiant' => $donneesEtudiant, 'donneesSecretaire' => $donneesSecretaire, 'donneesUtilisateur' => $donneesUtilisateur));
        }
    }

/*!
 * \author Brice VICO
 *
 * \fn public function supprimerUtilisateurId($id, $donnees)
 * \return supprimerUtilisateur.html.twig
 *
 * \brief Cette fonction permet de supprimer un utilisateur avec un id = $id.
 * \brief La vue est retournée avec des variable spécifique :
 * \brief - afficherFlash : détermine si on doit afficher un message ou non.
 * \brief - typeFlash : nécessaire que si afficherFlash = 1, permet de faire varier de style de la boite de dialogue flash.
 * \brief - flash : contient le message flash à afficher si afficherFlash = 1.
 * \brief - form : le formulaire créé grâce à createFormBuilder et afficher ensuite avec $form->createView().
 *
 * \brief Si une erreur survient alors elle est indiquée à l'utilisateur grâce aux message flash.
 *
 */

    public function supprimerUtilisateurId($id)
    {
        $em = $this->getDoctrine()->getManager();
        $donnees = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findAll();

        $utilisateur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->find($id);

        if (!$utilisateur)
        {
            $donneesTuteur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('t');
            $donneesSecretaire = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('s');
            $donneesEtudiant = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('e');
            $donneesUtilisateur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('u');
            $flash = "Utilisateur inexistant.";
            $typeFlash = "danger";
                return $this->render('SiteAdminBundle:Gestion:supprimerUtilisateur.html.twig', array('afficherFlash' => 1, 'flash' => $flash, 'typeFlash' => $typeFlash, 'donneesTuteur' => $donneesTuteur, 'donneesSecretaire' => $donneesSecretaire, 'donneesEtudiant' => $donneesEtudiant, 'donneesUtilisateur' => $donneesUtilisateur));
        }

        if ($utilisateur->getType() == 'e')
            if (!is_null($utilisateur->getEtudiant()->getProjet()))
            {
                $etudiant = $utilisateur->getEtudiant();
                $projet = $etudiant->getProjet();
                $projet->removeEtudiant($etudiant);
                $projet->setNbInscritsEtud($projet->getNbInscritsEtud() - 1);
                $etudiant->setProjet(NULL);

                $em->persist($etudiant);
                $em->persist($projet);
            }

        $em->remove($utilisateur);
        $em->flush();

            $donneesTuteur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('t');
            $donneesSecretaire = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('s');
            $donneesEtudiant = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('e');
            $donneesUtilisateur = $em->getRepository("SiteUtilisateurBundle:Utilisateur")->findByType('u');

        $flash = "Utilisateur supprimé avec succés.";
        $typeFlash = "success";

                return $this->render('SiteAdminBundle:Gestion:supprimerUtilisateur.html.twig', array('afficherFlash' => 1, 'flash' => $flash, 'typeFlash' => $typeFlash, 'donneesTuteur' => $donneesTuteur, 'donneesSecretaire' => $donneesSecretaire, 'donneesEtudiant' => $donneesEtudiant, 'donneesUtilisateur' => $donneesUtilisateur));
    }

/*!
 * \author Brice VICO
 *
 * \fn public function ajouterEtudiantAction()
 * \return ajouterEtudiant.html.twig
 *
 * \brief Cette fonction permet d'ajouter de multiple étudiant depuis un fichier CSV dont vous en choisissez l'ordre des variable dans la vue.
 * \brief La vue est retournée avec des variable spécifique :
 * \brief - afficherFlash : détermine si on doit afficher un message ou non.
 * \brief - typeFlash : nécessaire que si afficherFlash = 1, permet de faire varier de style de la boite de dialogue flash.
 * \brief - flash : contient le message flash à afficher si afficherFlash = 1.
 * \brief - form : le formulaire créé grâce à createFormBuilder et afficher ensuite avec $form->createView().
 * \brief - listeUe : la liste des Ue récupéré depuis la BDD
 */

    public function ajouterEtudiantAction()
    {
        $em = $this->getDoctrine()->getManager();
        $request = $this->get('request');

        $listeUe = $em->getRepository('SiteGeneralBundle:Ue')->findAll();
        $arrayUE = array();
        foreach($listeUe as $ue)
        {
            $arrayUE[$ue->getId()] = $ue->getCode();
        }

        if ($request->getMethod() == 'POST')
        {
            $csv = $this->remplirCsv($request);

            $fichierCsv = fopen($csv->getFichier(), "r");
            $typeDonnees = $csv->getTypeDonnees();

            while(($ligne = fgetcsv($fichierCsv, 0, $csv->getDelimiter(), $csv->getEntourage())) != NULL)
            {
                $utilisateur = new Utilisateur;
                $etudiant = new Etudiant;

                for ($i = 0; $i < 6; $i++)
                {
                    switch ($typeDonnees[$i])
                    {
                        case 'username' :
                            $utilisateur->setUsername($ligne[$i]);
                            $utilisateur->setUsernameCanonical($ligne[$i]);
                            break;
                        case 'email' :
                            $utilisateur->setEmail($ligne[$i]);
                            $utilisateur->setEmailCanonical($ligne[$i]);
                            break;
                        case 'nom' :
                            $utilisateur->setNom($ligne[$i]);
                            break;
                        case 'prenom' :
                            $utilisateur->setPrenom($ligne[$i]);
                            break;
                        case 'password' :
                            $mdp = $ligne[$i];
                            $encodeur = $this->get('security.encoder_factory')->getEncoder($utilisateur);
                            $utilisateur->setPassword($encodeur->encodePassword($mdp, $utilisateur->getSalt()));
                            break;
                        case 'numEtud' :
                            $etudiant->setNumEtud($ligne[$i]);
                            break;
                    }
                }

                $utilisateur->setType('e');
                $etudiant->setUe($request->get('ue'));
                $utilisateur->setEtudiant($etudiant);

                $em->persist($etudiant);
                $em->persist($utilisateur);
                $em->flush();
            }

            $flash = "Tous les étudiants ont été ajouté avec succés.";
            $typeFlash = "success";
            return $this->render('SiteAdminBundle:Gestion:ajouterEtudiant.html.twig', array('afficherFlash' => 1, 'typeFlash' => $typeFlash, 'flash' => $flash, 'listeUe' => $listeUe));
        }
        else
        {

            return $this->render('SiteAdminBundle:Gestion:ajouterEtudiant.html.twig', array('afficherFlash' => 0, 'listeUe' => $listeUe));
        }
    }

/*!
 * \author Brice VICO
 *
 * \fn public function remplirCsv($request)
 * \return $csv un objet de type Csv.
 *
 * \brief Cette fonction permet de remplir un objet Csv d'après les variables du formulaire passé dans $request.
 */

    public function remplirCsv($request)
    {
        $uploaddir = 'fichiers/';
        $uploadfile = $uploaddir . basename($_FILES['fichier']['name']);
        move_uploaded_file($_FILES['fichier']['tmp_name'], $uploadfile);

        $csv = new Csv($uploadfile);
        $csv->setDelimiter($request->get('delimiteur'));
        $csv->setEntourage($request->get('entourage'));

        $typeDonnees = array();

        for ($i = 0; $i < 6; $i++)
            $typeDonnees[$i] = $request->get('variable' . $i);

        $csv->setTypeDonnees($typeDonnees);

        return $csv;
    }


/*!
*
* \author Hovannes Genjoyan
*
* \fn public function sauverBDDAction()
* \return index.html.twig
*
* \brief cette fonction crée une sauvegarde dans un fichier .sql de la base de donnée, grâce à la fonction system() qui permet d'éxécuter une commande sur l'hôte.
* \brief La vue principale du site est ensuite retournée.
*
*/

    public function sauverBDDAction() //sauverBDD() et enlever return render
    {
      //$repository = $this->getDoctrine()
      //                   ->getManager()

      $date = 'd-m-Y-H';
      $host = 'localhost';
      $username = 'root';
      $password = 'MDP';
      $database = 'nomBDD';
      $rep = './rep/';

      system("mysqldump --host=".$host." --user=".$username." --password=".$password."
      ".$database."  > ".$rep.$database."-".$date.".sql");

      return $this->render('SiteGeneralBundle:Default:index.html.twig');
    }

}
